/********************************************************************** 
 * FILE		: MD5Encryption.java					
 *			
 * AUTHOR   : shihao	
 * 
 * DATE		: 2014-5-30
 * 									
 * REASON	: CREATE  
 *
 ***********************************************************************/

package com.common.util.encryption;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**********************************************************************
 * @author GA 采用AES加密解密
 * @version 1.0
 ***********************************************************************/

public class AESEncryption
{
    /**
     * AES加密
     * 
     * @param String
     *            content 需要加密的内容
     * @param String
     *            password 加密密码
     * @return String 加密的内容
     */

    public static String encrypt( String content, String password )
    {
        try
        {
            KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
            kgen.init( 128, new SecureRandom( password.getBytes() ) );
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec( enCodeFormat, "AES" );
            Cipher cipher = Cipher.getInstance( "AES" );// 创建密码器
            byte[] byteContent = content.getBytes( "utf-8" );
            cipher.init( Cipher.ENCRYPT_MODE, key );// 初始化
            byte[] result = cipher.doFinal( byteContent );
            return parseByte2HexStr( result ); // 加密
        } catch ( NoSuchAlgorithmException e )
        {
            e.printStackTrace();
        } catch ( NoSuchPaddingException e )
        {
            e.printStackTrace();
        } catch ( InvalidKeyException e )
        {
            e.printStackTrace();
        } catch ( UnsupportedEncodingException e )
        {
            e.printStackTrace();
        } catch ( IllegalBlockSizeException e )
        {
            e.printStackTrace();
        } catch ( BadPaddingException e )
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * AES解密
     * 
     * @param String
     *            content 待解密内容
     * @param String
     *            password 解密密钥
     * @return String 解密后的内容
     */
    public static String decrypt( String nr, String password )
    {
        byte[] content = AESEncryption.parseHexStr2Byte( nr );
        try
        {
            KeyGenerator kgen = KeyGenerator.getInstance( "AES" );
            kgen.init( 128, new SecureRandom( password.getBytes() ) );
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec( enCodeFormat, "AES" );
            Cipher cipher = Cipher.getInstance( "AES" );// 创建密码器
            cipher.init( Cipher.DECRYPT_MODE, key );// 初始化
            byte[] result = cipher.doFinal( content );
            return new String( result ); // 加密
        } catch ( NoSuchAlgorithmException e )
        {
            e.printStackTrace();
        } catch ( NoSuchPaddingException e )
        {
            e.printStackTrace();
        } catch ( InvalidKeyException e )
        {
            e.printStackTrace();
        } catch ( IllegalBlockSizeException e )
        {
            e.printStackTrace();
        } catch ( BadPaddingException e )
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将二进制转换成16进制
     * 
     * @param buf
     *            二进制内容
     * @return 16进制内容
     */
    private static String parseByte2HexStr( byte buf[] )
    {
        StringBuffer sb = new StringBuffer();
        for ( int i = 0; i < buf.length; i++ )
        {
            String hex = Integer.toHexString( buf[i] & 0xFF );
            if ( hex.length() == 1 )
            {
                hex = '0' + hex;
            }
            sb.append( hex.toUpperCase() );
        }
        return sb.toString();
    }

    /**
     * 将16进制转换为二进制
     * 
     * @param String
     *            hexStr 16进制
     * @return String 二进制
     */
    private static byte[] parseHexStr2Byte( String hexStr )
    {
        if ( hexStr.length() < 1 )
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for ( int i = 0; i < hexStr.length() / 2; i++ )
        {
            int high = Integer.parseInt( hexStr.substring( i * 2, i * 2 + 1 ),
                    16 );
            int low = Integer.parseInt(
                    hexStr.substring( i * 2 + 1, i * 2 + 2 ), 16 );
            result[i] = (byte)(high * 16 + low);
        }
        return result;
    }

}